/*
  AT命令框架基础部分
  将AT命令分为两个类型
    1、具有确定的返回语
    2、不确定返回语或者不确定返回长度

  对于类型1：
    1、比对到设置的字符退出，执行回调
    2、超时退出，执行回调

  对于类型2：
    1、超时切未获取到数据
    2、超时但获取到数据，中间存在断歇的增大延后超时时间
*/
#ifndef __AT_CMDBASE_H_
#define __AT_CMDBASE_H_

#include "stdio.h"
#include "string.h"

#ifdef __cplusplus
extern "C"
{
#endif

/*
AT命令消息队列最大元素个数
*/
#define AT_CMD_QUEUE_MAX_SIZE  (30)  

/*
数据接收缓冲区最大长度
*/
#define AT_CMD_REVBUF_MAX_SIZE  (4096)

/*
AT命令发送的状态
*/
typedef enum AT_CMD_STATUS_t
{
   AT_CMD_STATUS_OK = 1,      //AT命令发送成功
   AT_CMD_STATUS_ERROR = 2,   //AT命令发送失败
   AT_CMD_STATUS_OUTTIME = 3, //响应超时
   AT_CMD_STATUS_DATA_OVERFLOW = 4, //接收数据超过缓冲区大小
   AT_CMD_STATUS_MAX = 0XFF
}AT_CMD_STATU;


/*
定义实现AT解析需要的底层外设接口
*/

/*
 * brief: 发送数据函数
 * senddata: 发送的数据
 * datalen: 发送的数据长度
 * return: 已发送的数据长度
 */
typedef int (*AT_SendData)(char *senddata, int datalen);

/*
 * brief: 接收数据函数
 * revbuf: 接收的数据缓冲区
 * wantsize: 希望接收的数据长度
 * return: 实际接收的数据长度
 */
typedef int (*AT_RevData)(char *revbuf, int wantsize);

/*
 * brief: 设备初始化函数
 * return: -1 初始化错误 0 初始化成功
 */
typedef int (*AT_DevInit)();


/*
 * brief: AT命令发送后的执行回调
 * reponsedata: 命令响应的数据
 * cmdstatus: 对于确定响应字符的命令的状态码
 * data: 自定义数据
 */
typedef void (*AT_ResponseCallback)(char *reponsedata, AT_CMD_STATU cmdstatus, void *data);


/*
 * brief: 获取当前系统时间 ms
 * return: 时间ms
 */
typedef long (*AT_GetCurTicks)();



/*

*/

/*
 * brief: 注册实现AT命令需要的接口
 * init: 设备初始化函数
 * send: 设备发送函数
 * rev:  设备接收函数
 * getticks: 系统时间ms
 * data: 自定义数据
 */
void AT_CmdBaseRegister(AT_DevInit init, AT_SendData send, AT_RevData rev, AT_GetCurTicks getticks);



/*
 * brief: 确定回复字符的AT命令发送
 * cmdstr: 命令字符
 * responseok: 正确响应的字符
 * responseerr:  错误响应的字符
 * cb: 命令响应回调
 * mstimeout： 接收超时时间
 * data: 自定义数据
 * return: -1 发送错误 0 发送成功 
 */
int AT_CmdBaseSendWithConfirmReply(char *cmdstr, char *responseok, char *responseerr, AT_ResponseCallback cb, int mstimeout, void *data);



/*
 * brief: 不确定回复字符的AT命令发送
 * cmdstr: 命令字符
 * AT_ResponseCallback: 命令响应回调
 * mstimeout： 接收超时时间
 * return: -1 发送错误 0 发送成功 
 */
int AT_CmdBaseSendWithUnConfirmReply(char *cmdstr,  AT_ResponseCallback cb, int mstimeout, void *data);


/*
 * brief: 循环调度处理命令响应
 */
int AT_CmdBaseProcess();

#ifdef __cplusplus 
}
#endif

#endif